<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>promise的理解与使用</title>
</head>

<body>

</body>
<script>
  /* 
   *promise是什么？
    1、抽象表述：
      Promise 是 JS 中进行异步编程的新的解决方案
    2、具体表述：
      (1) 从语法上来说：promise是一个构造函数
      (2) 从功能上来说：promise对象用来封装一个异步操作并可以获取其结果
   */

  /* 
   *Promise的状态和状态的改变
   1、3 种状态：
     (1) 待定（pending）
     (2) 兑现（fulfilled，有时候也称为“解决”，resolved）
     (3) 拒绝（rejected）
   2、状态改变
     待定（pending）是期约的最初始状态。在待定状态下，期约可以落定（settled）为代表成功的兑现
   （fulfilled）状态，或者代表失败的拒绝（rejected）状态。无论落定为哪种状态都是不可逆的。只要从待
   定转换为兑现或拒绝，期约的状态就不再改变。而且，也不能保证期约必然会脱离待定状态。因此，组
   织合理的代码无论期约解决（resolve）还是拒绝（reject），甚至永远处于待定（pending）状态，都应该
   具有恰当的行为。
   重要的是，期约的状态是私有的，不能直接通过 JavaScript 检测到。这主要是为了避免根据读取到
   的期约状态，以同步方式处理期约对象。另外，期约的状态也不能被外部 JavaScript 代码修改。这与不
   能读取该状态的原因是一样的：期约故意将异步行为封装起来，从而隔离外部的同步代码。
   3、总结
     pending ——> resolved 
     pending ——> rejected
     只有这两种情况，且一个promise对象只能改变一次，无论变为成功还是失败，都会有一个结果数据，成功的结果数据一般称为vlaue，
     失败的结果数据一般称为reason
   */

  // promise的简单使用

  // 1、创建一个新的promise对象
  const p = new Promise((resolve, reject) => {  //执行器函数
    // 2、执行异步操作任务
    setTimeout(() => {
      const time = Date.now(); //如果当前时间是偶数代表成功，否则代表失败
      // 3、如果成功了，调用resolve(value)
      if (time % 2 === 0) {
        resolve('成功的数据，time=' + time);
      } else {
        // 4、如果失败了，调用reject(reason)
        reject('失败的数据，time=' + time);
      }
    }, 1000);
  });

  p.then(
    value => { //接收得到成功的value数据  onResolved
      console.log('成功的回调', value);
    },
    reason => { //接受得到失败的reason数据  onRejected
      console.log('失败的回调', reason);
    }
  )






</script>

</html>